/**
 * eventEmitter 的使用，
 * on(eventName, fn), 将事件绑定到eventEmitter中，
 * once(eventName, fn)， 注册一个只会调用一次的事件
 * emit(eventName, args), 触发eventName事件， 后面是携带的参数
 * remove(eventName), 移除事件队列中的指定事件名的事件
 */

class Event{
    constructor() {
        this.events = {}
        this.tag = false
    }

    on(event, fn){
        // 这里， 如果没有event， 那么就将方法放进去， 如果有该方法了
        // 还是可以把这个方法放进去的
        if(this.events[event]){
            this.events[event].push(fn)
        }else {
            this.events[event] = [fn]
        }
    }

    once(event, fn) {
        if(tag) return
        this.events[event] = fn
        this.tag = false
    }

    emit(event, ...args){
        // 一个方法名可能有多个方法， 所以， 这里才会有一个方法名， 需要遍历循环的做法
        this.events[event].forEach(fn => {
            fn.apply(this, args)
        })
    }

    remove(event){
        if(this.events[event]){
            delete this.events[event]
        }
    }
}
